package com.simonall.print;

import java.io.InputStream;
import java.util.List;
import java.util.stream.Stream;

import javax.print.PrintService;
import javax.print.PrintServiceLookup;

import com.simonall.enums.FileExtenNameEnum;

import cn.hutool.core.collection.CollUtil;

/**
 * 打印服务
 * 
 * @author simonall
 */
public interface PrintHandler {

	public static final List<PrintHandler> factory = CollUtil.newArrayList();

	/**
	 * 适配可以处理的实现类
	 * 
	 * @param fileSuffixName 文件后缀名如：pdf
	 * @return
	 */
	static PrintHandler adapter(String fileSuffixName) {
		return factory.stream().filter(it -> {
			return Stream.of(it.handleType()).anyMatch(t -> t.name().equalsIgnoreCase(fileSuffixName));
		}).findFirst().orElse(null);
	}

	/**
	 * 默认打印机
	 * 
	 * @return
	 */
	default PrintService defaultService() {
		return PrintServiceLookup.lookupDefaultPrintService();
	}

	/**
	 * 处理类型
	 * 
	 * @return
	 */
	public FileExtenNameEnum[] handleType();

	/**
	 * 打印服务
	 * 
	 * @param bytes       打印数据
	 * @param serviceName 服务名称
	 * @param copies      打印份数
	 */
	void print(byte[] bytes, PrintService service, Integer copies) throws Exception;

	/**
	 * 打印服务
	 * 
	 * @param input       输入流
	 * @param serviceName 服务名称
	 * @param copies      打印份数
	 */
	void print(InputStream input, PrintService service, Integer copies) throws Exception;

	/**
	 * 打印服务
	 * 
	 * @param url         文件路径
	 * @param serviceName 服务名称
	 * @param copies      打印份数
	 */
	void print(String url, PrintService service, Integer copies) throws Exception;
}
